# -*- coding: utf-8 -*-
# 姓名:谚语
# 开发时间:2022/10/9 15:06
from flask import Flask
from settings import dict_config
from flask_migrate import Migrate

'''
创建app的函数，参数是代表运行的类型: 1、开发环境，2、生产环境
'''


def create_app(run_type):
    app = Flask(__name__)
    # 加载整个项目的配置
    app.config.from_object(dict_config.get(run_type))

    # 初始化SQLAlchemy，MySQL的数据库链接
    from comment.modules import db
    db.init_app(app)

    # 初始化Redis的数据库链接
    from comment.utils.Financlal_Redis import fr
    fr.init_app(app)

    # 初始化日志处理的工具
    from comment.utils.Financial_Logging import create_logger
    create_logger(app)

    # 初始化Migrate
    '''
        可执行命令: flask db init [初始化migrations目录], flask db migrate [装载,设置版本], flask db upgrade [创建数据库表(也叫映射)]
        执行以上三个命令,需要默认的Flask项目入口文件。当前项目没有默认的项目入口文件。
        需要设置环境变量:set FLASK_APP=financial/main.py(文件所在的位置)
        再次执行只需要敲后两个命令即可
    '''
    Migrate(app, db)

    # 注册token认证的请求钩子
    from comment.utils.request_auth import jwt_request_auth
    # before_request() 在每次请求之前执行一次请求钩子[也就是进行一次token的认证]
    app.before_request(jwt_request_auth)  # 注册请求钩子函数

    # 注册蓝图
    from financial.resources.user import user_bp
    from financial.resources.letter import letter_bp
    from financial.resources.card import card_bp
    from financial.resources.product import product_bp
    from financial.resources.transaction import transaction_bp
    from financial.resources.account import account_bp

    app.register_blueprint(user_bp)
    app.register_blueprint(letter_bp)
    app.register_blueprint(card_bp)
    app.register_blueprint(product_bp)
    app.register_blueprint(transaction_bp)
    app.register_blueprint(account_bp)

    return app
